계수 정렬
계수 정렬(Counting Sort)
- 계수 정렬은 Counting Sort로 요소의 값들끼리 서로 비교하지 않고 정렬하는 알고리즘
- 배열 내 최대 값 + 1 만큼의 길이 배열이 필요 => 메모리 낭비될 수 있음
- 최대값과 최소값을 알아야 쓸 수 있음
- 시간 복잡도는
- 배열counts 생성
- 배열counts에 카운팅 값 입력
- 배열counts에 누적값 업데이트
- 정렬 결과 배열sorted 채우기
선택 정렬 구현
계수 정렬 애니메이션 에 들어가서 애니메이션을 보시면 이해하기 편합니다
void Counting_Sort() {
int MAX = 5;
int[] nums = { 0, 1, 5, 4, 2, 3, 2, 4, 5, 3, 2, 1, 2, 0, 0 };
int len = nums.length;
int[] counts = new int[MAX + 1];
int[] sorted = new int[len];
for (int i = 0; i < len; i++) {
counts[nums[i]]++;
}
for (int i = 0; i < MAX+1; i++) {
System.out.print(counts[i]+" ");
}
System.out.println();
for (int i = 1; i <= MAX; i++) {
counts[i] += counts[i - 1];
}
for (int i = 0; i < MAX+1; i++) {
System.out.print(counts[i]+" ");
}
System.out.println();
for (int i = 0; i < len; i++) {
sorted[--counts[nums[i]]] = nums[i];
}
for (int i = 0; i < len; i++) {
System.out.print(sorted[i]+" ");
}
System.out.println();
}
결과 :
- 주어진 nums 배열의 앞쪽부터 하나씩 counts 배열에 집어넣는다.
- counts 배열을 누적 합으로 변경시켜 준다.
- nums 배열의 맨 뒤의 숫자부터 차례로 sorted 배열에 집어넣는다.(sorted 배열은 1부터 시작하는 배열)
출력을 하게 되면 정렬된 결과가 나오게 된다.
tip
사용하기 좋은 예 : 데이터의 범위는 상대적으로 좁은데 비해 데이터의 갯수가 많은 경우
ex) 1~ 1,000,000의 범위를 가지는 수가 1억개 있는 경우
계수 정렬의 장단점
장점
- 매우 빠른시간에 정렬할 수 있다.
- 안정 정렬이다.
단점
배열의 인덱스를 이용하기 때문에 정해진 범위에 한정하여 정렬 가능
가장 큰수에 따라서 메모리 잡는 부분이 달라진다.
나올 수 있는 면접 질문
- 계수 정렬이란 무엇일까?
- 계수 정렬을 사용할 수 있는 조건은?
- 계수 정렬을 언제 사용하는 것이 좋을까?
참고 url
기여자
HelloNaks
📦